/*

  The contents of this file are subject to the Mozilla Public License Version
  1.1 (the "License"); you may not use this file except in compliance with
  the License. You may obtain a copy of the License at 
  
           http://www.mozilla.org/MPL/ 
  
  Software distributed under the License is distributed on an "AS IS" basis,
  WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  for the specific language governing rights and limitations under the License. 
  
  The Original Code is Indigo framework applicatif.
  
  The Initial Developer of the Original Code is
  Olivier Bugalotto (aka Iteratif) <olivier.bugalotto@iteratif.net>.
  Portions created by the Initial Developer are Copyright (C) 2004-2008
  the Initial Developer. All Rights Reserved.
  
  Contributor(s) :
  
*/
package indigo.register
{
	import indigo.collections.Hashtable;
	import indigo.config.IObjectDefinition;
	
	/**
	 * Le referentiel de definitions d'objets <code>ObjectDefinitionRegistry</code> est
	 * un dictionnaire de paires key/value.
	 *
	 * @example Creation en actionscript d'une definition d'objet:
	 * <listing version="3.0">
	 * <b>var</b> properties:Array = [<b>new</b> Property(<i>"source"</i>,<i>"HelloWorld"</i>),
	 * 						   		  <b>new</b> Property(<i>"destination"</i>,<i>"amfphp"</i>),
	 * 						   		  <b>new</b> Property(<i>"endpoint"</i>,<i>"http://www.monserver.com/amfphp/gateway.php"</i>)];
	 * 
	 * <b>var</b> definition:IObjectDefinition = <b>new</b> ObjectDefinition(getQualifiedClassName(mx.rpc.remoting.mxml.RemoteObject),
	 * 														   true,properties);
	 * 
	 * <b>var</b> registry:IObjectDefinitionRegistry = <b>new</b> ObjectDefinitionRegistry();
	 * registry.registerDefinition(<i>"remote"</i>,definition);
	 * </listing>
	 * 
	 */
	public class ObjectDefinitionRegistry implements IObjectDefinitionRegistry
	{
		private var _definitions:Hashtable;
		
		/**
		 * Obtenir le nombre de definitions d'objets present dans le referentiel
		 * @return 
		 * 
		 */
		public function get numDefinitions():uint {
			return _definitions.count;
		}
		
		/**
		 * Creer un objet <code>ObjectDefinitionRegistry</code>. 
		 * 
		 */
		public function ObjectDefinitionRegistry()
		{
			_definitions = new Hashtable();
		}
		
		/**
		 * Connaitre si un objet est unique 
		 * @param name	Nom d'identification d'une definition dans le referentiel
		 * @return 
		 * 
		 */
		public function isSingleton(name:String):Boolean {
			var definition:IObjectDefinition = getDefinition(name);
			return definition.isSingleton;
		}

		/**
		 * Obtenir la reference d'une definition d'objet à partir de son nom d'identification
		 * 
		 * @param name	Nom d'identification d'une definition dans le referentiel
		 * @return 
		 * 
		 */
		public function getDefinition(name:String):IObjectDefinition {
			return _definitions.getValue(name) as IObjectDefinition;
		}
		
		/**
		 * Enregistre une definition d'objet associe a un nom d'identification.
		 *  
		 * @param name			Nom d'identification d'une definition dans le referentiel
		 * @param definition	Referentiel d'une definition d'objet
		 * 
		 */
		public function registerDefinition(name:String, definition:IObjectDefinition):void {
			_definitions.addItem(name,definition);
		}
		
		/**
		 * Savoir si le referentiel possede une definition d'objet correspondant au nom d'identification passe 
		 * @param name	Nom d'identification d'une definition dans le referentiel
		 * @return 
		 * 
		 */
		public function containsDefinition(name:String):Boolean {
			return _definitions.contains(name);
		}
		
		/* public function getDependenciesFromObjectName(name:String):Array {
			var names:Array = [];
			var definition:IObjectDefinition = getDefinition(name);
			for each(var dn:String in definition.dependencies) {
				names.push(dn);
			}
			return names;
		} */
		
		/**
		 * Obtenir un tableau des noms d'identification 
		 * @return 
		 * 
		 */
		public function getDefinitionNames():Array {
			return _definitions.keys;
		}
	}
}